#! /usr/bin/env python

import random
from optparse import OptionParser

def print_hex(v):
    if v < 16:
        return '0x0%x' % v
    else:
        return '0x%x' % v
    
def print_bin(word):
    v = bin(word)
    o = '0b'
    o += ('0' * (10 - len(str(v))))
    o += str(v)[2:]
    return o
    

parser = OptionParser()
parser.add_option('-s', '--seed', default='0', help='Random seed',
                  action='store', type='int', dest='seed')
parser.add_option('-d', '--data_size', default='4',
                  help='Number of bytes in data word',
                  action='store', type='int', dest='data_size')
parser.add_option('-D', '--data', default='',
                  help='Data in comma separated form',
                  action='store', type='string', dest='data')
parser.add_option('-c', '--compute', help='compute answers for me',
                  action='store_true', default=False, dest='solve')
(options, args) = parser.parse_args()

print ''
print 'OPTIONS seed', options.seed
print 'OPTIONS data_size', options.data_size
print 'OPTIONS data', options.data
print ''

random.seed(options.seed)

values = []
if options.data != '':
    tmp = options.data.split(',')
    for t in tmp:
        values.append(int(t))
else:
    for t in range(int(options.data_size)):
        values.append(int(random.random() * 256))



add = 0
xor = 0
fletcher_a, fletcher_b = 0, 0

for value in values:
    add = (add + value) % 256
    xor = xor ^ value
    fletcher_a = (fletcher_a + value) % 255
    fletcher_b = (fletcher_b + fletcher_a) % 255

print 'Decimal:  ', 
for word in values:
    print '%10s' % str(word),
print ''

print 'Hex:      ', 
for word in values:
    print '     ', print_hex(word),
print ''

print 'Bin:      ', 
for word in values:
    print print_bin(word),
print ''

print ''
if options.solve:
    print 'Add:           ', '%3d      ' % add, '(%s)' % print_bin(add)
    print 'Xor:           ', '%3d      ' % xor, '(%s)' % print_bin(xor)
    print 'Fletcher(a,b): ', '%3d,%3d  ' % (fletcher_a, fletcher_b), '(%s,%s)' % (print_bin(fletcher_a), print_bin(fletcher_b))
else:
    print 'Add:      ?'
    print 'Xor:      ?'
    print 'Fletcher: ?'
print ''
    


